#include "head.h"
#include <l8w8jwt/encode.h>
#include <l8w8jwt/decode.h>

// 得到 token 
int l8w8jwt(char* jwt, size_t* jwt_lenth, int uid)
{
    // 用于存储生成的JWT字符串
    char *tmp_jwt;

    // JWT字符串的长度
    size_t tmp_jwt_length;

    // 初始化编码参数结构体
    struct l8w8jwt_encoding_params params;
    l8w8jwt_encoding_params_init(&params);

    // 设置JWT使用的算法，这里使用HS512
    params.alg = L8W8JWT_ALG_HS512;

    // 设置JWT的主要荷载部分内容:
    // 主题
    char id[100] = {0};
    sprintf(id, "%d", uid);
    params.sub = id;
    // 签发者
    params.iss = "huzhu";
    // 接收方
    params.aud = "huzhu";
    // token过期/有效时间(0x7fffffff:最大值-> 2038年1月19日)
    params.exp = 0x7fffffff;
    // token签发时间
    params.iat = 0;
    // 设置加密密钥
    params.secret_key = (unsigned char *)"huzhu is the best boy";
    params.secret_key_length = strlen((char *)params.secret_key);

    // 输出变量
    params.out = &tmp_jwt;
    params.out_length = &tmp_jwt_length;

    // 加密
    l8w8jwt_encode(&params);

    // 输出结果
    // printf("l8w8jwt create token: %s \n", jwt);
    // 返回结果
    strcpy(jwt, tmp_jwt);
    *jwt_lenth = tmp_jwt_length;
    // 释放token 字符串的内存
    l8w8jwt_free(tmp_jwt);
}


// 得到 uid
int l8w8jwt_uid(const char* jwt, int* uid)
{
    // 初始化解码参数结构体
    struct l8w8jwt_decoding_params params;
    l8w8jwt_decoding_params_init(&params);

    // 设置JWT使用的算法，这里使用HS512
    params.alg = L8W8JWT_ALG_HS512;

    // 填入token字符串和长度
    params.jwt = (char *)jwt;
    params.jwt_length = strlen(jwt);

    // 设置密钥
    char *key = "huzhu is the best boy";
    params.verification_key = (unsigned char *)key;
    params.verification_key_length = strlen(key);

    // 定义: 接收结果的指针和变量
    struct l8w8jwt_claim *claims = NULL;
    size_t claim_count = 0;
    enum l8w8jwt_validation_result validation_result;

    // 解码: 获得token中存储的信息
    int decode_result = l8w8jwt_decode(&params, &validation_result, &claims, &claim_count);

    // 判断是否是正确的token
    if (decode_result == L8W8JWT_SUCCESS && validation_result == L8W8JWT_VALID)
    {                                               
        printf("Token validation successful!\n");
        *uid = atoi(claims[3].value);
        l8w8jwt_free_claims(claims, claim_count);
        return 0;
    }
    else
    {
        printf("Token validation failed!\n");
        l8w8jwt_free_claims(claims, claim_count);
        return -1;
    }

    

    return 0;
}